home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / archiver / zoo21src.zoo / zooadd2.c < prev    next >
C/C++ Source or Header  |  1991-07-24  |  9KB  |  288 lines

  1. #ifndef LINT
  2. /* derived from: zooadd2.c 2.14 88/01/27 10:40:32 */
  3. static char sccsid[]="$Id: zooadd2.c,v 1.4 1991/07/24 23:47:04 bjsjr Rel $";
  4. #endif /* LINT */
  5.  
  6. /*
  7. Copyright (C) 1986, 1987 Rahul Dhesi -- All rights reserved
  8. (C) Copyright 1988 Rahul Dhesi -- All rights reserved
  9. */
  10. #include "options.h"
  11. #include "zoo.h"
  12. #ifndef    OK_STDIO
  13. #include <stdio.h>
  14. #define    OK_STDIO
  15. #endif
  16. #include "various.h"
  17. #include "zooio.h"
  18. #include "zoofns.h"
  19. #include "errors.i"
  20. #include "assert.h"
  21. #include "debug.h"
  22. #include "parse.h"
  23.  
  24. /*
  25. Miscellaneous routines to support zooadd().
  26. */
  27.  
  28. /****************
  29. This function is called with zoo_file positioned to the first
  30. directory entry in an archive.  It skips past all existing files,
  31. counts the number of deleted files, saves the latest data and time
  32. encountered, and adds all filenames encountered to a global list. The
  33. long filename is added if available, else the MSDOS filename is
  34. added.  
  35. */
  36.  
  37. void skip_files (zoo_file, latest_date, latest_time, delcount, 
  38.                   latest_name, latest_pos)
  39. ZOOFILE zoo_file;
  40. unsigned int *latest_date, *latest_time;
  41. int *delcount;
  42. char latest_name[];
  43. long *latest_pos;
  44. {
  45.    long save_offset, next_ptr;
  46.    struct direntry direntry;
  47.    struct direntry *drp = &direntry;
  48.  
  49.    *latest_pos = 0L;
  50.    do {
  51.       /* read a directory entry */
  52.       save_offset = zootell (zoo_file);     /* save pos'n of this dir entry */
  53. #ifndef GLOB
  54.       readdir (&direntry, zoo_file, 1);   /* read directory entry */
  55. #else
  56.       zreaddir (&direntry, zoo_file, 1);   /* read directory entry */
  57. #endif /* GLOB */
  58.       if (drp->next == 0L) {                 /* END OF CHAIN */
  59.          zooseek (zoo_file, save_offset, 0);      /* back up */
  60.          break;                                 /* EXIT on end of chain */
  61.       } else
  62.          *latest_pos = save_offset;
  63.       /* remember most recent date and time, for files not marked deleted */
  64.       if (!drp->deleted)
  65.          if (drp->date > *latest_date ||
  66.             (drp->date == *latest_date && drp->time > *latest_time)) {
  67.                *latest_date = drp->date;
  68.                *latest_time = drp->time;
  69.          }
  70.       next_ptr = drp->next;            /* ptr to next dir entry */
  71.       if (drp->deleted)
  72.          ++(*delcount);                      /* count deleted entries */
  73.       /* add name of file and position of direntry into global list */
  74.       /* but only if the entry is not deleted */
  75.       if (!drp->deleted) {
  76. #ifdef FOLD
  77.             /* IS THIS REALLY NEEDED?  IF SO, WHAT ABOUT drp->lfname? */
  78.          str_lwr(drp->fname);
  79. #endif
  80.             /* add full pathname to global list */
  81.             strcpy (latest_name, fullpath (drp));
  82.          addfname (latest_name, save_offset, drp->date, drp->time,
  83.                             drp->vflag, drp->version_no);
  84.       }
  85.       zooseek (zoo_file, next_ptr, 0);   /* ..seek to next dir entry */
  86.    } while (next_ptr != 0L);              /* loop terminates on null ptr */
  87. }
  88.  
  89. /*******************/
  90. /* kill_files() deletes all files in the supplied list of pointers to
  91. filenames */
  92.  
  93. int kill_files (flist, pathlength)
  94. char *flist[];                      /* list of ptrs to input fnames */
  95. int pathlength;                     /* length of longest pathname */
  96. {
  97.    int status = 0;
  98.    int fptr;
  99.    prterror ('M', "-----\nErasing added files...\n");
  100.    for (fptr = 0;  flist[fptr] != NULL; fptr++) {
  101. #ifdef CHEKUDIR
  102.                 if (isuadir(flist[fptr]))
  103.                     continue;
  104. #else /* CHEKUDIR */
  105. # ifdef CHEKDIR
  106.                 if (isfdir(flist[fptr]))
  107.                     continue;
  108. # endif /* CHEKDIR */
  109. #endif /* CHEKUDIR */
  110.       prterror ('m', "%-*s -- ", pathlength, flist[fptr]);
  111.       if (unlink (flist[fptr]) == 0) {
  112.          prterror ('M', "erased\n");
  113.       } else {
  114.          prterror ('w', "Could not erase %s.\n", flist[fptr]);
  115.          status = 1;
  116.       }
  117.    }
  118.    return (status);
  119. }
  120.  
  121. #ifndef PORTABLE
  122. /*******************/
  123. void copyfields (drp, thp)
  124. struct direntry *drp;
  125. struct tiny_header *thp;
  126. {
  127.    drp->org_size = thp->org_size;
  128.    drp->file_crc = thp->file_crc;
  129.    drp->size_now = thp->size_now;
  130.    drp->major_ver = thp->major_ver;
  131.    drp->minor_ver = thp->minor_ver;
  132. }
  133. #endif
  134.  
  135. /*******************/
  136. /* processes option switches for zooadd() */
  137. void opts_add (option, zootime, quiet, suppress, move, new, pack,
  138.           update, add_comment, z_fmt, need_dir, inargs, genson,
  139.              use_lzh, arch_cmnt)
  140. char *option;
  141. int *zootime, *quiet, *suppress, *move, *new, *pack,
  142.    *update, *add_comment, *z_fmt, *need_dir, *inargs,
  143.     *genson, *use_lzh, *arch_cmnt;
  144.  
  145. {
  146.    if (*option == 'T') {
  147.       (*zootime)++;
  148.       option++;
  149.       while (*option) {
  150.          switch (*option) {
  151.             case 'q': (*quiet)++; break;
  152.             default:
  153.                prterror ('f', inv_option, *option);
  154.          }
  155.       option++;
  156.       }
  157.    }
  158.    
  159.    while (*option) {
  160.       switch (*option) {
  161.          case 'a': break;  
  162.             case 'h': (*use_lzh)++; break;         /* use lzh compression */
  163.          case 'f': (*suppress)++; break;        /* suppress compression */
  164.          case 'M': (*move)++; break;            /* delete files after adding them */
  165.          case 'n': (*new)++; break;             /* add only files not in archive */
  166.          case 'P': (*pack)++; break;            /* pack after adding */
  167.          case 'u': (*update)++;   break;        /* add only files already in archive */
  168.          case 'q': (*quiet)++; break;           /* be quiet */
  169.          case 'c': (*add_comment)++; break;     /* add comment */
  170.          case ':': *need_dir = 0; break;        /* don't store directories */
  171.          case 'I': (*inargs)++; break;            /* get filenames from stdin */
  172.          case 'C': (*arch_cmnt)++; break;            /* do an archive comment */
  173. /* #ifdef PORTABLE */ /* avoid Turbo C warning about unused param */
  174.          case 'z': (*z_fmt)++; break;           /* look for Z format files */
  175. /* #endif */
  176.             case '+': 
  177.                         *genson = 1;  break;
  178.             case '-': 
  179.                         *genson = 0;  break;
  180. #ifdef atarist /* allow a// to decend directories recirsively */
  181.     case '/':
  182.         if(*++option == '/')
  183.             break;
  184.             /* else invalid -- fall thru */
  185. #endif
  186.          default:
  187.             prterror ('f', inv_option, *option);
  188.       }
  189.       option++;
  190.    } /* end while */
  191.     if (*suppress && *use_lzh)
  192.         prterror ('f', "\"f\" and \"h\" can't both be used\n");
  193. }
  194.  
  195. /* 
  196. Stores long filename into direntry.lfname iff it is different from MSDOS
  197. filename.  Also stores directory name if need_dir is true.  Moved out of 
  198. zooadd() so zooadd() doesn't get too big for optimization.
  199. */
  200. void storefname (direntry, this_path, need_dir)
  201. struct direntry *direntry;
  202. char *this_path;
  203. int need_dir;
  204. {
  205.    struct path_st path_st;
  206.    parse (&path_st, this_path);
  207.    direntry->lfname[0] = '\0';
  208.    direntry->namlen = 0;
  209. #ifdef SPECMOD
  210.    specfname (path_st.lfname);
  211.    specdir (path_st.dir);
  212. #endif
  213.    if (strcmp(path_st.lfname,direntry->fname) != 0) {
  214.          strcpy (direntry->lfname, path_st.lfname); /* full filename */
  215.          direntry->namlen = strlen(direntry->lfname) + 1;
  216.    }
  217.    if (need_dir) {
  218.       strcpy (direntry->dirname, path_st.dir);   /* directory name */
  219.       direntry->dirlen = strlen(direntry->dirname) + 1;
  220.       if (direntry->dirlen == 1) /* don't store trailing null alone */
  221.          direntry->dirlen = 0;
  222.    } else {
  223.       direntry->dirname[0] = '\0';
  224.       direntry->dirlen = 0;
  225.    }
  226. }
  227.  
  228. /* 
  229. Function getsdtin() gets a pathname from standard input, cleans
  230. it if necessary by removing any following blanks/tabs and other
  231. junk, and returns it in a static area that is overwritten by each
  232. call.
  233. */
  234. char *getstdin()
  235. {
  236.     char *chptr;                                    /* temp pointer */
  237.     static char tempname[PATHSIZE];
  238.     do {
  239.         if (fgets (tempname, PATHSIZE, stdin) == NULL)
  240.             return (NULL);
  241.         /* remove trailing blank, tab, newline */
  242.         for (chptr = tempname; *chptr != '\0';  chptr++) {
  243.             if (
  244.     /* PURIFY means remove trailing blanks/tabs and all subsequent chars */
  245. #ifdef PURIFY
  246.                     *chptr == '\t' || *chptr == ' ' ||
  247. #endif
  248.                     *chptr == '\n'                        /* always remove trailing \n */
  249.                 )
  250.